package groep1.filter;

import groep1.ObjectRepresentation;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

import bluej.debugmgr.inspector.FieldInfo;

public class FilterObject extends FilterHierarchyObject {

	protected HashSet<ObjectRepresentation> lijst;
	protected HashMap<String, List<FieldInfo>> result = new HashMap<String, List<FieldInfo>>();
	protected String regex;
	
	public FilterObject(String regex, HashSet<ObjectRepresentation> objects) { // zien dat het overweg kan met nullobjecten
		if (objects == null) {
			this.regex = regex;
			return;
		}
		lijst = objects;
		if (regex.equals("")) {
			this.regex = "default";
			for (ObjectRepresentation obj : lijst) {
				result.put(obj.getUniqueKey(), obj.getFieldList());
			}
		} else {
			this.regex = regex.trim(); // regex is nu van de vorm <letter>:{<regular expression>}
			int switcher = regex.substring(0, 1).hashCode();
			this.regex = regex.substring(3,regex.length()-1);
			switch(switcher) { // switch mag niet met String
				case(118): filterOpDescription("veld"); break; // v - veldnaam
				case(116): filterOpDescription("type"); break; // t - type
				case(119): filterOpWaarde(); break; // w - waarde veld
				case(107): filterOpKlasse(); break; // k - klassenaam
				case(112): filterOpPakket(); break; // p - pakketnaam
				case(111): filterOpObject(); break; // o - objectnaam
				default: throw new IllegalArgumentException();
			}
		}
	}

	protected void filterOpDescription(String param) { // filteren op arrays met [A-Za-z0-9]+\[\]
		int k = 2;
		if (param.equals("veld"))
			k = 1;
		for (ObjectRepresentation obj : lijst) {
			List<FieldInfo> newList = new ArrayList<FieldInfo>();
			for (FieldInfo fieldInfo : obj.getFieldList()) {
				String[] temp = fieldInfo.getDescription().split(" ");
				String compStr = temp[temp.length-k];
				if (compStr.matches(regex))
					newList.add(fieldInfo); // voldoet aan regex
			}
			result.put(obj.getUniqueKey(),newList);
		}

	}

	protected void filterOpWaarde() {
		for (ObjectRepresentation obj : lijst) {
			List<FieldInfo> newList = new ArrayList<FieldInfo>();
			for (FieldInfo fieldInfo : obj.getFieldList()) {
				System.out.println(fieldInfo.getValue());
				if (fieldInfo.getValue().matches(regex))
					newList.add(fieldInfo); // voldoet aan regex
			}
			result.put(obj.getUniqueKey(),newList);
		}
	}

	protected void filterOpKlasse() {
		for (ObjectRepresentation obj : lijst) {
			String[] temp =  obj.getObject().getClassName().split("\\.");
			if (temp[temp.length-1].matches(regex))
				result.put(obj.getUniqueKey(), obj.getFieldList());
			else
				result.put(obj.getUniqueKey(),new ArrayList<FieldInfo>()); // geen velden als het niet voldoet
		}
	}

	protected void filterOpPakket() {
		for (ObjectRepresentation obj : lijst) {
			String[] temp = obj.getObject().getClassName().split("\\.");
			boolean testen = true;
			int i = 0;
			while(i < temp.length-1) { // laatste is naam zelf, moet niet gecontroleerd worden
				if (!temp[i].matches(regex))
					testen = false;
				i++;
			}
			if (testen)
				result.put(obj.getUniqueKey(),obj.getFieldList());
			else
				result.put(obj.getUniqueKey(),new ArrayList<FieldInfo>()); // geen velden als het niet voldoet
		}
	}

	protected void filterOpObject() {
		for (ObjectRepresentation obj : lijst) {
			if (obj.getName().matches(regex))
				result.put(obj.getUniqueKey(),obj.getFieldList());
			else
				result.put(obj.getUniqueKey(),new ArrayList<FieldInfo>()); // geen velden als het niet voldoet
		}
	}

	@Override
	public HashMap<String, List<FieldInfo>> join() {
		return result;
	}
	
	public String getRegex(){
		return regex;
	}

}
